package cn.h8k.hj212.factory;

import cn.h8k.hj212.codec.EnhancedHj212Codec;
import cn.h8k.hj212.codec.Hj212EntityCodec;
import cn.h8k.hj212.codec.Hj212Validator;
import cn.h8k.hj212.codec.impl.DefaultHj212EntityCodec;
import cn.h8k.hj212.codec.impl.DefaultHj212Validator;
import cn.h8k.hj212.plugin.PluginManager;
import cn.h8k.hj212.plugin.impl.AtmosphericFactorPlugin;
import cn.h8k.hj212.version.ProtocolVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * HJ212协议实体类编解码器工厂类
 * 用于创建不同配置的Hj212EntityCodec实例
 *
 * @author HJ212 Team
 * @since 1.0
 */
public class Hj212EntityCodecFactory {

    private static final Logger logger = LoggerFactory.getLogger(Hj212EntityCodecFactory.class);

    /**
     * 创建默认的HJ212协议实体类编解码器
     * @return 默认配置的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createDefaultCodec() {
        Hj212Validator validator = new DefaultHj212Validator();
        return new DefaultHj212EntityCodec(validator);
    }

    /**
     * 创建增强的HJ212协议实体类编解码器
     * 支持插件化、版本适配、性能优化等功能
     * @return 增强的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createEnhancedCodec() {
        // 注册默认插件
        registerDefaultPlugins();

        // 创建增强编解码器
        return new EnhancedHj212Codec(true, true, ProtocolVersion.getDefault());
    }

    /**
     * 创建增强的HJ212协议实体类编解码器（自定义配置）
     * @param enableCache 是否启用缓存
     * @param enableValidation 是否启用验证
     * @param defaultVersion 默认协议版本
     * @return 增强的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createEnhancedCodec(boolean enableCache, boolean enableValidation, ProtocolVersion defaultVersion) {
        // 注册默认插件
        registerDefaultPlugins();

        return new EnhancedHj212Codec(enableCache, enableValidation, defaultVersion);
    }

    /**
     * 创建高性能的HJ212协议实体类编解码器
     * 启用缓存和优化功能，适用于高并发场景
     * @return 高性能的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createHighPerformanceCodec() {
        // 注册默认插件
        registerDefaultPlugins();

        // 启用缓存，禁用详细验证以提高性能
        return new EnhancedHj212Codec(true, false, ProtocolVersion.getDefault());
    }

    /**
     * 创建自定义的HJ212协议实体类编解码器
     * @param validator 自定义校验器
     * @return 自定义配置的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createCustomCodec(Hj212Validator validator) {
        return new DefaultHj212EntityCodec(validator);
    }

    /**
     * 创建不进行CRC校验的HJ212协议实体类编解码器
     * @return 不进行CRC校验的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createNoCrcCheckCodec() {
        Hj212Validator validator = new DefaultHj212Validator(true, false); // 只校验长度，不校验CRC
        return new DefaultHj212EntityCodec(validator);
    }

    /**
     * 创建不进行任何校验的HJ212协议实体类编解码器
     * @return 不进行校验的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createNoValidationCodec() {
        Hj212Validator validator = new DefaultHj212Validator(false, false); // 不校验长度，不校验CRC
        return new DefaultHj212EntityCodec(validator);
    }

    /**
     * 创建用于测试的HJ212协议实体类编解码器
     * 禁用校验和缓存，便于测试
     * @return 测试用的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createTestCodec() {
        return new EnhancedHj212Codec(false, false, ProtocolVersion.getDefault());
    }

    /**
     * 创建兼容模式的HJ212协议实体类编解码器
     * 支持多版本协议，适用于需要兼容不同版本的场景
     * @return 兼容模式的Hj212EntityCodec实例
     */
    public static Hj212EntityCodec createCompatibilityCodec() {
        // 注册默认插件
        registerDefaultPlugins();

        // 启用验证但禁用缓存，确保兼容性
        return new EnhancedHj212Codec(false, true, ProtocolVersion.getDefault());
    }

    /**
     * 注册默认插件
     */
    private static void registerDefaultPlugins() {
        PluginManager pluginManager = PluginManager.getInstance();

        try {
            // 注册大气环境监测因子插件
            if (pluginManager.getAllPlugins().isEmpty()) {
                pluginManager.registerPlugin(new AtmosphericFactorPlugin());
                logger.info("默认插件注册完成");
            }
        } catch (Exception e) {
            logger.warn("注册默认插件失败", e);
        }
    }

    /**
     * 获取工厂配置信息
     * @return 配置信息
     */
    public static FactoryInfo getFactoryInfo() {
        return new FactoryInfo();
    }

    /**
     * 工厂信息类
     */
    public static class FactoryInfo {
        private final String version = "1.0.0";
        private final String[] supportedVersions = {"HJ212-2017"};
        private final String[] availablePlugins;

        public FactoryInfo() {
            PluginManager pluginManager = PluginManager.getInstance();
            this.availablePlugins = pluginManager.getAllPlugins().keySet().toArray(new String[0]);
        }

        public String getVersion() {
            return version;
        }

        public String[] getSupportedVersions() {
            return supportedVersions.clone();
        }

        public String[] getAvailablePlugins() {
            return availablePlugins.clone();
        }
    }
}